package com.eastfair.projectcore.service;

import com.eastfair.boot.service.SuperService;
import com.eastfair.core.base.R;
import com.eastfair.projectcore.dto.AppMenuDTO;
import com.eastfair.projectcore.dto.AppMenuSaveDTO;
import com.eastfair.projectcore.dto.AppMenuUpdateDTO;
import com.eastfair.projectcore.entity.AppMenu;
import com.eastfair.projectcore.vo.AppMenuVO;
import com.eastfair.projectcore.vo.MenuVO;

import java.util.List;

/**
 * <p>
 * 业务接口
 * 前端菜单（之所以分开是因为避免指定上级菜单出错）
 * </p>
 *
 * @author ligang
 * @date 2021-10-28
 */
public interface AppMenuService extends SuperService<AppMenu> {


    /**
     * 删除,并删除旗下所有子菜单
     * @param id 主键id
     * @return
     */
    R del(Long id);

    /**
     * 删除子节点
     * @param appMenu 前端菜单
     * @return
     */
    R delChild(AppMenu appMenu);


    /**
     * 获取排序值
     * @param parentId 父级id
     * @return
     */
    int querySort(Long parentId);

    /**
     * 获取code值
     * @param appMenu 前端菜单
     * @return
     */
    String queryCode(AppMenu appMenu);

    /**
     * 排序置顶
     * @param id 主键id
     * @param id
     */
    void sortTop(Long id);


    /**
     * 初始化排序
     * @param parentId 父级id
     * @return
     */
    void initSort(Long parentId);

    /**
     * 查询code相关的所有信息
     * @param rightCodes  右关联code  code%
     * @param leftCodes   左关联code   %code
     * @return
     */
    List<AppMenu> queryAllOfCode(List<String> rightCodes, List<String> leftCodes, AppMenuDTO appMenuDTO);


    /**
     * 查询code相关的所有信息数量
     * @param code code码
     * @return
     */
    int queryCodeSize(String code);

    /**
     * 加载数据成树状结构
     * @param parentCode 根code码
     * @param appMenuVOList 前端菜单vo集合
     * @return
     */
    AppMenuVO loadTree(String parentCode, List<AppMenuVO> appMenuVOList);


    /**
     * 创建菜单节点
     *
     * @param appMenuSaveDTO 菜单新增实体
     * @return
     */
    R<AppMenu> createMenu(AppMenuSaveDTO appMenuSaveDTO);

    /**
     * 修改菜单节点
     *
     * @param appMenuUpdateDTO 菜单修改实体
     * @return
     */
    R<AppMenu> updateMenu(AppMenuUpdateDTO appMenuUpdateDTO);

    /**
     * 查询子集菜单信息，只查一层子集
     * @param parentId 父级id
     * @return
     */
    List<AppMenu> queryEntityOfParentId(Long parentId);

    /**
     * 查询菜单信息和全部子信息
     * @param id  主键id
     * @return
     */
    AppMenuVO findAllById(Long id);

    /**
     * 查询左侧菜单信息(包含菜单，目录)
     * @param id 菜单id
     * @return
     */
    AppMenuVO findAllByIdNoButton(Long id);

    /**
     * 通过子菜单查询菜单信息和全部子信息
     * @param childIds 子集菜单id集合
     */
    List<AppMenuVO> findAllByChildId(List<Long> childIds);

    /**
     * 通过子菜单查询菜单的权限标识
     * @param childIds
     * @return
     */
    List<String> findPermissionAllByChildId(List<Long> childIds);



}
